import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../models/plist_model.dart';
import '../../../service/HttpsClient.dart';
import '../../../utils/sortType.dart';

class ProductlistController extends GetxController {
  //TODO: Implement ProductlistController
  ScrollController scrollController = ScrollController(); //监听滚动事件
  RxList<PlistItemModel> productList = <PlistItemModel>[].obs;
  int pageNum = 1;
  int pageSize = 8;
  String sortName =
      FilterType.all.field!; // 排序名称-- 销量：salecount，价格：price，全部：all
  RxString sortType = FilterType.all.sort.toString().obs; // 排序方式-- -1：降序，1：升序
  bool flag = true; // 滚动条请求标识
  RxBool hasData = true.obs; // 请求分页数据是否已经完毕
  late double currentPosition;
  late double maxScrollExtent;
  GlobalKey<ScaffoldState> scaffoldGlobalKey =
      GlobalKey<ScaffoldState>(); // 侧滑菜单key
  var subHeaderList = FilterType.value; // 自定义筛选列表
  // 侧滑菜单数据
  RxInt activeIndex = 1.obs; // 当前选中的tab索引(从1开始)
  // String? cid = ""; // 分类id
  // String? keywords = ""; // 搜索关键字
  String apiUrl = "";

  // 切换tab
  void changedIndex(int? index) {
    activeIndex.value = index!; // 更新当前选中的tab索引
    if (index == FilterType.filter.id) {
      // 点击筛选
      return scaffoldGlobalKey.currentState!.openEndDrawer(); // 打开侧滑菜单
    }
    refreshProductListData();
  }

  /// 刷新商品列表数据
  void refreshProductListData() {
    // 重置请求参数和数据展示并重新回到顶部
    pageNum = 1;
    hasData.value = true;
    productList.clear(); // 清空列表数据
    scrollController.jumpTo(0); // 回到顶部
    getProductListData(); // 重新获取列表数据
  }

  // 获取指定页面的列表
  void getProductListData() async {
    if (flag && hasData.value) {
      // 防止重复请求
      flag = false; // 滚动条请求标识

      if (Get.arguments["cid"] != null) {
        // 从分类页面进来的
        print(
          "api/plist?cid=${Get.arguments["cid"]}&page=$pageNum&pageSize=$pageSize&sort=${sortName}_$sortType", // 控制台打印请求地址
        );
        apiUrl =
            "api/plist?cid=${Get.arguments["cid"]}&page=$pageNum&pageSize=$pageSize&sort=${sortName}_$sortType";
      } else {
        // 从搜索页面进来的
        print(
          "api/plist?search=${Get.arguments["keywords"]}&page=$pageNum&pageSize=$pageSize&sort=${sortName}_$sortType", // 控制台打印请求地址
        );
        apiUrl =
            "api/plist?search=${Get.arguments["keywords"]}&page=$pageNum&pageSize=$pageSize&sort=${sortName}_$sortType";
      }

      var response = await HttpsClient().get(apiUrl);
      if (response != null) {
        PlistModel pListModel = PlistModel.fromJson(response);
        productList.addAll(pListModel.result!); // 将新数据添加到列表中--合并数组
        // productList.value = pListModel.result!;
        pageNum++; // 分页加载，页码加1
        flag = true; // 滚动条请求标识
        // print("pListModel.result!.length: ${pListModel.result!.length}");

        if (pListModel.result!.length < pageSize) {
          // 数据不足8条表明下次不需要请求了
          hasData.value = false; // 没有更多数据了
        }

        update(); // 更新UI触发Obx监听
      }
    }
  }

  // 向下滑动分页加载
  void onScroll() {
    // print("onScroll");
    scrollController.addListener(() {
      currentPosition = scrollController.position.pixels;
      maxScrollExtent = scrollController
          .position
          .maxScrollExtent; // SrollController 监听控件可以滚动的最大范围
      if (currentPosition + 20 > maxScrollExtent) {
        getProductListData(); // 向下滑动分页加载
      }
    });
  }

  @override
  void onInit() {
    super.onInit();
    // print(Get.arguments); // 获取传递过来的参数
    getProductListData(); // 获取商品列表数据
    onScroll(); // 监听滚动事件
  }

  @override
  void onReady() {
    super.onReady();
  }

  @override
  void onClose() {
    super.onClose();
  }
}
